package controllers;

import play.mvc.*;
import play.data.*;
import static play.data.Form.*;
import play.*;

import models.*;
import views.html.pageErreurConnexion;
import views.html.connexionUtilisateur.*;
import views.html.ConsoleAdmin.*;

public abstract class Application extends Controller {

	public static Result indexAdmin(final String mess) {
		return ok(indexAdmin.render(mess));
	}

	public static Result indexEtudiant(final String mess) {
		return ok(indexEtudiant.render(mess));
	}

	public static Result indexExpert(final String mess) {
		return ok(indexExpert.render(mess));
	}

	public static Result connexion() {
		if (session().get("id") != null) {
			return redirectionAccueil("");
		} else {
			return ok(connexion.render(""));
		}
	}

	public static Result redirectionAccueil(final String mess) {

		if (estConnecte()) {
			final Utilisateur us = Utilisateur.findById(Long
					.parseLong(session("id")));

			switch (us.getStatut()) {
			case Etudiant:
				return indexEtudiant(mess);
			case Expert:
				return indexExpert(mess);
			case Administrateur:
				return indexAdmin(mess);
			default:
				return ok(connexion.render(""));
			}
		}
		return null;

	}

	public static Result authentification() {
		final DynamicForm dynamicForm = form().bindFromRequest();

		// si le user existe pour le login et le mdp saisi
		if (Utilisateur.authenticate(dynamicForm.get("login"),
				dynamicForm.get("pwd")) != null) {

			final Utilisateur us = Utilisateur.findById(Utilisateur
					.authenticate(dynamicForm.get("login"),
							dynamicForm.get("pwd")).getIdUtilisateur());
			session("id", us.getIdUtilisateur().toString());
			session("statut", us.getStatut().toString());

			Logger.debug("Authencitifcation user : Id = "
					+ us.getIdUtilisateur());

			// si le user est un étudiant
			if (us.getStatut().equals(Statut.Etudiant)) {
				return indexEtudiant("");
			} else {
				// si le user est un expert
				if (us.getStatut().equals(Statut.Expert)) {
					return indexExpert("");
					// sinon le user est un admin
				} else {
					return indexAdmin("");
				}
			}

		} else {
			return ok(connexion
					.render("L'identifiant ou le mot de passe est incorrect, Veuillez réessayer"));
		}
	}

	public static Result deconnexion() {
		session().clear();
		return redirect(routes.Application.connexion());
	}

	public static boolean estConnecte() {
		if (session().containsKey("id")) {
			return true;
		}
		return false;
	}

	public static boolean estEtudiant() {
		final Utilisateur us = Utilisateur.findById(Long
				.parseLong(session("id")));
		// si le user est un étudiant
		if (us.getStatut().equals(Statut.Etudiant)) {
			return true;
		}

		return false;
	}

	public static boolean estAdmin() {
		final Utilisateur us = Utilisateur.findById(Long
				.parseLong(session("id")));
		// si le user est un étudiant
		if (us.getStatut().equals(Statut.Administrateur)) {
			return true;
		}

		return false;
	}

	public static Result consoleAdmin() {
		if (Application.estAdmin()) {

			return ok(indexConsoleAdmin.render());
		} else
			return ok(pageErreurConnexion.render());
	}
}
